#include "../include/Heros_SFML.h"

Heros_SFML::Heros_SFML(Heros* p_heros)
{
    heros = p_heros;
}


sf::Sprite Heros_SFML::recup_sprite_carte()
{
    return sprite_carte[num_sprite];
}

sf::Sprite* Heros_SFML::recup_sprite_combat()
{
    return sprite_combat;
}

void Heros_SFML::charge_sprite()
{
    // On va maintenant s'occuper d'initialiser l'image les Sprites du personnage
    string chaine = heros->recup_ad_image();
    chaine += "sprite.png";
    if (!image_carte.LoadFromFile(chaine))
    {
        std::cout << "ERREUR LORS DU CHARGEMENT DU HEROS" << std::endl;
    }

    image_carte.CreateMaskFromColor(sf::Color(255,255,255));
    int f_compteur = 0;
    int f_taille_x = image_carte.GetWidth()/4;
    int f_taille_y = image_carte.GetHeight()/4;

    for (int i=0; i < 4; i++)
    {
        for (int j=0; j < 4; j++)
        {
            sprite_carte[f_compteur].SetImage(image_carte);
            sprite_carte[f_compteur].SetSubRect(sf::IntRect(j*f_taille_x, i*f_taille_y,
                                                      (j+1)*f_taille_x, (i+1)*f_taille_y));
            sprite_carte[f_compteur].SetCenter(0,0);
            sprite_carte[f_compteur].Resize(40.f,48.f);
            f_compteur ++;
       }
   }


    //On initialise maintenant les sprites de combats
    chaine = "data/Combat/";
    chaine += heros->recup_archetype();
    chaine += ".png"; // Manque de Sprite, tous seront identiques
    if (!image_combat.LoadFromFile("data/Combat/Guerrier.png"))
    {
        std::cout << "ERREUR LORS DU CHARGEMENT DU HEROS DE COMBAT" << std::endl;
    }

    image_combat.CreateMaskFromColor(sf::Color(133,176,182));
    f_compteur = 0;
    f_taille_x = image_combat.GetWidth()/5;
    f_taille_y = image_combat.GetHeight()/5;

    for (int i=0; i < 4; i++)
    {
        for (int j=0; j < 5; j++)
        {
            sprite_combat[f_compteur].SetImage(image_combat);
            sprite_combat[f_compteur].SetSubRect(sf::IntRect(j*f_taille_x, i*f_taille_y,
                                                      (j+1)*f_taille_x, (i+1)*f_taille_y));
            sprite_combat[f_compteur].SetCenter(0,0);
            sprite_combat[f_compteur].FlipX(true);
            sprite_combat[f_compteur].Resize(250.f,250.f);
            f_compteur ++;
       }
   }
}

void Heros_SFML::se_deplace()
{
    if(heros->est_en_mouvement())
    {
        pas ++;

        if(pas == 4)
        {
            num_sprite -= 3;
            pos_x += mouvement_x;
            pos_y += mouvement_y;
            mouvement_x = 0;
            mouvement_y = 0;
            heros->fin_mouvement();
        }
        else
            { num_sprite ++; }

        float position_x = (float)pos_x + (pas/4.f)*mouvement_x;
        float position_y = (float)pos_y + (pas/4.f)*mouvement_y;
        position_x *= 50;
        position_y *= 50;
        sprite_carte[num_sprite].SetPosition(position_x+5, position_y);
    }
}

void Heros_SFML::debute_mouvement(int p_x, int p_y)
{
    mouvement_x = p_x;
    mouvement_y = p_y;

    if (p_y == 1)
    {
        num_sprite = 0;
    }
    else if (p_y == -1)
    {
        num_sprite = 12;
    }
    else if (p_x == 1)
    {
        num_sprite = 8;
    }
    else if (p_x == -1)
    {
        num_sprite = 4;
    }

    pas = 0;
    sprite_carte[num_sprite].SetPosition(pos_x*50+5, pos_y*50);
}

void Heros_SFML::mise_en_place()
{
    charge_sprite();

    heros->fin_mouvement();
    pos_x = heros->recup_pos_x();
    pos_y = heros->recup_pos_y();

    mouvement_x = 0;
    mouvement_y = 0;
    pas = 0;

    num_sprite = 0;
    sprite_carte[num_sprite].SetPosition(pos_x*50, pos_y*50);
}

int Heros_SFML::recup_vitesse()
{
    return heros->recup_vitesse();
}

int Heros_SFML::recup_mana_max()
{
    return heros->recup_mana_max();
}

int Heros_SFML::recup_mana()
{
    return heros->recup_mana();
}

int Heros_SFML::recup_vie_max()
{
    return heros->recup_vie_max();
}

int Heros_SFML::recup_vie()
{
    return heros->recup_vie();
}

void Heros_SFML::info_competence(string* &p_tab_comp, int* p_nombre)
{
    *p_nombre = heros->recup_nb_competence();

    p_tab_comp = new string[*p_nombre];
    for (int i = 0; i < *p_nombre; i++)
    {
        p_tab_comp[i] = (heros->recup_competence(i))->recup_nom();
    }
}


int Heros_SFML::recup_point_action()
{
    return heros->recup_point_action();
}
